﻿Public Class FrmPagos

    Private Sub FrmPagos_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Me.dgvdetalle.AutoGenerateColumns = False
        Me.llenarCombos()
        Me.CargarPago()
    End Sub

    Private Sub btnBuscarFact_Click(sender As System.Object, e As System.EventArgs) Handles btnBuscarFact.Click

        If Integer.Parse(cboCliente.SelectedValue) > 0 Then
            Dim frmBuscador As New BuscFactura
            frmBuscador.esVenta = False
            frmBuscador.codProveedor = Integer.Parse(cboCliente.SelectedValue)
            frmBuscador.ShowDialog()
            codFactura = frmBuscador.codFactura
            txtNroFactura.Text = frmBuscador.nroFactura
            fechaFactura.Value = frmBuscador.fechaFactura
            txtTotalFactura.Text = frmBuscador.totalFactura.ToString("N0")
            txtSaldo.Text = frmBuscador.saldoFactura.ToString("N0")
        End If

    End Sub

    Dim controller As New Class_RC_Controller.rc_Cobros
    Dim proveedor As New Class_RC_Controller.rc_Proveedores
    Dim mante As New Class_RC_Controller.rc_Mantenimiento
    Dim facturas As New Class_RC_Controller.rc_Facturas

    Private _codPago As Integer = 0

    Public Property codPago() As Integer
        Get
            Return _codPago
        End Get
        Set(value As Integer)
            _codPago = value
            txtcodigo.Text = value.ToString().PadLeft(4, "0")
        End Set
    End Property

    Private _codFactura As Integer = 0

    Public Property codFactura() As Integer
        Get
            Return _codFactura
        End Get
        Set(value As Integer)
            _codFactura = value
        End Set
    End Property

    Private Sub llenarCombos()
        cboEstado.SelectedIndex = 0

        Dim ds As DataTable
        ds = proveedor.get_Proveedores_All(oiml.dbConn, 0, "", "", 0)
        With Me.cboCliente
            .DataSource = ds
            .DisplayMember = "nombre"
            .ValueMember = "codProveedor"
        End With

        Dim dsFPago As DataTable
        dsFPago = controller.get_formaPago(oiml.dbConn)
        With Me.cboFormaPago
            .DataSource = dsFPago
            .DisplayMember = "descFormaPago"
            .ValueMember = "codFormaPago"
        End With

    End Sub

    Private Sub CargarDetalles()
        If codPago > 0 Then

            Dim dt As New DataTable
            dt = controller.get_Pagos_Detalles_All(oiml.dbConn, codPago)
            If Not dt Is Nothing Then
                dgvdetalle.DataSource = dt
                cboCliente.Enabled = False
            Else
                dgvdetalle.DataSource = Nothing
                cboCliente.Enabled = True
            End If

        End If

    End Sub

    Private Sub CargarPago()
        Try
            If codPago > 0 Then

                Dim ds As New DataTable
                ds = controller.get_Pagos_ByID(oiml.dbConn, codPago)

                If Not ds Is Nothing Then

                    ' cargar los controles del formulario con los valores de los campos del registro
                    codPago = ds.Rows(0)("codPago").ToString
                    Me.txtNroRecibo.Text = ds.Rows(0)("nroRecibo").ToString
                    Me.fechaCobro.Value = DateTime.Parse(ds.Rows(0)("fechaPago").ToString())
                    Me.cboEstado.SelectedValue = ds.Rows(0)("estadoPago").ToString

                    If ds.Rows(0)("total").ToString <> "" Then
                        Me.txtTotalRecibo.Text = ds.Rows(0)("total").ToString
                    Else
                        Me.txtTotalRecibo.Text = 0
                    End If

                    Me.cboCliente.SelectedValue = ds.Rows(0)("codProveedor").ToString
                    Me.lblUsuario.Text = ds.Rows(0)("usuario").ToString
                    Me.lblfechaActualizacion.Text = ds.Rows(0)("fechaActualizacion_").ToString

                    CargarDetalles()

                    If controller.Update_Pagos(oiml.dbConn, codPago, fechaCobro.Value, Integer.Parse(cboCliente.SelectedValue),
                                                            txtNroRecibo.Text, txtTotalRecibo.Text, cboEstado.Text, oiml.idUsuario) = False Then
                        MessageBox.Show("Error: " & controller.MessageError.Message, "Pagos", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        Exit Sub
                    End If

                End If

            Else

                ' cargar los controles del formulario con los valores de los campos del registro
                codPago = 0
                Me.txtNroRecibo.Text = ""
                Me.fechaCobro.Value = Date.Now
                Me.cboEstado.SelectedIndex = 0
                Me.txtTotalRecibo.Text = 0
                Me.cboCliente.SelectedIndex = 0

                lblUsuario.Text = oiml.Usuario
                lblfechaActualizacion.Text = Date.Now.ToShortDateString

                fechaCobro.Focus()

            End If

        Catch ex As Exception
            MessageBox.Show("Error: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try

    End Sub

    Private Shadows Sub KeyUpmask(ByVal MaskedTextboxs As System.Windows.Forms.MaskedTextBox, ByVal e As System.Windows.Forms.KeyEventArgs)

        'Teclas que Utilizaremos El cual solo son las numericas
        If e.KeyData = Keys.Space Or e.KeyData = Keys.Decimal Or _
         e.KeyData = Keys.NumPad0 Or e.KeyData = Keys.NumPad1 Or e.KeyData = Keys.NumPad2 Or e.KeyData = Keys.NumPad3 _
           Or e.KeyData = Keys.NumPad4 Or e.KeyData = Keys.NumPad5 Or e.KeyData = Keys.NumPad6 Or _
           e.KeyData = Keys.NumPad7 Or e.KeyData = Keys.NumPad8 Or e.KeyData = Keys.NumPad9 _
           Or e.KeyData = Keys.D0 Or e.KeyData = Keys.D1 Or e.KeyData = Keys.D2 Or e.KeyData = Keys.D3 Or _
           e.KeyData = Keys.D4 Or e.KeyData = Keys.D5 Or e.KeyData = Keys.D6 _
           Or e.KeyData = Keys.D7 Or e.KeyData = Keys.D8 Or e.KeyData = Keys.D9 Or e.KeyData = Keys.Tab Or e.KeyData = Keys.Enter _
            Then

            'Programamos la tecla de Retroceso en el textbox
        ElseIf e.KeyData = Keys.Back And MaskedTextboxs.Text.Length > 0 Then
            On Error Resume Next
            'Removemos un caracter mediante se presione la tecla Back
            MaskedTextboxs.Text.Remove(MaskedTextboxs.SelectionStart - 1)

            'si el textbox es menor que un caracter
        ElseIf MaskedTextboxs.Text.Length < 1 Then
            'ponemos el textbox En Blanco
            MaskedTextboxs.Text = String.Empty
            'ponemos la variable    NumerosYaescritos en Blanco

        Else
            'ponemos el textbox enblanco
            MaskedTextboxs.Text = String.Empty
            'Hacemos Sonar un Beep para indicarle al usuario que ha presionado un caracter y no un Numero
            Beep()
            MsgBox("Introducir solo valores numericos")
        End If

    End Sub

    Private Shadows Sub KeyUp(ByVal TextBoxs As System.Windows.Forms.TextBox, ByVal e As System.Windows.Forms.KeyEventArgs)

        'Teclas que Utilizaremos El cual solo son las numericas
        If e.KeyData = Keys.Space Or e.KeyData = Keys.Decimal Or _
         e.KeyData = Keys.NumPad0 Or e.KeyData = Keys.NumPad1 Or e.KeyData = Keys.NumPad2 Or e.KeyData = Keys.NumPad3 _
           Or e.KeyData = Keys.NumPad4 Or e.KeyData = Keys.NumPad5 Or e.KeyData = Keys.NumPad6 Or _
           e.KeyData = Keys.NumPad7 Or e.KeyData = Keys.NumPad8 Or e.KeyData = Keys.NumPad9 _
           Or e.KeyData = Keys.D0 Or e.KeyData = Keys.D1 Or e.KeyData = Keys.D2 Or e.KeyData = Keys.D3 Or _
           e.KeyData = Keys.D4 Or e.KeyData = Keys.D5 Or e.KeyData = Keys.D6 _
           Or e.KeyData = Keys.D7 Or e.KeyData = Keys.D8 Or e.KeyData = Keys.D9 Or e.KeyData = Keys.Tab Or e.KeyData = Keys.Enter _
           Or e.KeyData = Keys.OemMinus Then

            'Programamos la tecla de Retroceso en el textbox
        ElseIf e.KeyData = Keys.Back And TextBoxs.Text.Length > 0 Then
            On Error Resume Next
            'Removemos un caracter mediante se presione la tecla Back
            TextBoxs.Text.Remove(TextBoxs.SelectionStart - 1)

            'si el textbox es menor que un caracter
        ElseIf TextBoxs.Text.Length < 1 Then
            'ponemos el textbox En Blanco
            TextBoxs.Text = String.Empty
            'ponemos la variable    NumerosYaescritos en Blanco

        Else
            'ponemos el textbox enblanco
            TextBoxs.Text = String.Empty
            'Hacemos Sonar un Beep para indicarle al usuario que ha presionado un caracter y no un Numero
            Beep()
            MsgBox("Introducir solo valores numericos")
        End If

    End Sub

    Private Function ValidarCampos() As Boolean

        Dim controlCampos As Boolean = False

        If txtNroRecibo.Text = "" Then
            ErrorProvider.SetError(txtNroRecibo, "Campo obligatorio")
            controlCampos = True
        Else
            ErrorProvider.SetError(txtNroRecibo, "")
        End If

        If fechaCobro.Value.ToString = "" Then
            ErrorProvider.SetError(fechaCobro, "Campo obligatorio")
            controlCampos = True
        Else
            ErrorProvider.SetError(fechaCobro, "")
        End If

        Return controlCampos

    End Function

    Private Function ValidarDetallesCampos() As Boolean

        Dim controlCampos As Boolean = False

        If codFactura = 0 Then
            ErrorProvider.SetError(txtNroFactura, "Seleccionar factura")
            txtNroFactura.Text = ""
            controlCampos = True
        Else
            ErrorProvider.SetError(txtNroFactura, "")
        End If

        If txtNroFactura.Text.ToString = "" Then
            ErrorProvider.SetError(txtNroFactura, "Campo obligatorio")
            controlCampos = True
        Else
            ErrorProvider.SetError(txtNroFactura, "")
        End If

        If Not IsNumeric(txtMonto.Text) Then
            ErrorProvider.SetError(txtMonto, "Campo numerico, cantidad")
            controlCampos = True
        Else
            ErrorProvider.SetError(txtMonto, "")
        End If        '

        Return controlCampos

    End Function

    Private Sub btncancelar_Click(sender As System.Object, e As System.EventArgs) Handles btnCancelar.Click
        Me.Close()
    End Sub

    Private Sub btnAgregarDetalle_Click(sender As System.Object, e As System.EventArgs) Handles btnAgregarDetalle.Click
        Try

            If ValidarDetallesCampos() Then
                MessageBox.Show("Falta llenar datos del detalle", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
                btnBuscarFact.Focus()
            Else

                If codPago = 0 Then

                    If ValidarCampos() Then
                        fechaCobro.Focus()
                        Exit Sub
                    Else

                        codPago = controller.Insert_Pagos(oiml.dbConn, fechaCobro.Value, Integer.Parse(cboCliente.SelectedValue),
                                                            txtNroRecibo.Text, txtTotalRecibo.Text, cboEstado.Text,
                                                            oiml.idUsuario)

                        If codPago = 0 Then
                            MessageBox.Show("Error: " & controller.MessageError.Message, "Pagos", MessageBoxButtons.OK, MessageBoxIcon.Error)
                            Exit Sub
                        End If

                    End If

                Else

                    If ValidarCampos() Then
                        fechaCobro.Focus()
                        Exit Sub
                    Else

                        If controller.Update_Pagos(oiml.dbConn, codPago, fechaCobro.Value, Integer.Parse(cboCliente.SelectedValue),
                                                            txtNroRecibo.Text, txtTotalRecibo.Text, cboEstado.Text,
                                                            oiml.idUsuario) = False Then
                            MessageBox.Show("Error: " & controller.MessageError.Message, "Pagos", MessageBoxButtons.OK, MessageBoxIcon.Error)
                            Exit Sub
                        End If

                    End If

                End If

                If codPago > 0 Then
                    If controller.Insert_Pagos_Detalle(oiml.dbConn, codPago, codFactura, Decimal.Parse(txtMonto.Text), Integer.Parse(cboFormaPago.SelectedValue)) Then
                        CargarPago()
                        limpiarDetalles()

                    Else
                        MessageBox.Show("Error: " & controller.MessageError.Message, "Pagos", MessageBoxButtons.OK, MessageBoxIcon.Error)

                    End If

                End If

            End If

        Catch ex As Exception
            MsgBox(ex.Message)

        End Try

        txtMonto.Text = 0

    End Sub

    Public Sub limpiarDetalles()
        codFactura = 0
        txtNroFactura.Text = ""
        fechaFactura.Value = Date.Now
        txtTotalFactura.Text = 0
        txtSaldo.Text = 0
    End Sub

    Private Sub btnEliminarDetalle_Click(sender As System.Object, e As System.EventArgs) Handles btnEliminarDetalle.Click
        Try
            If dgvdetalle.SelectedRows.Count > 0 Then
                Dim codDetalle As Integer
                codDetalle = dgvdetalle.SelectedRows(0).Cells(0).Value

                If codDetalle > 0 And MessageBox.Show("Desea eliminar el registro seleccionado?", "Pagos", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then

                    If controller.Delete_Pagos_Detalle(oiml.dbConn, codDetalle) Then
                        CargarPago()
                    Else
                        MessageBox.Show("Error: " & controller.MessageError.Message, "Pagos", MessageBoxButtons.OK, MessageBoxIcon.Error)

                    End If

                End If

            End If

        Catch ex As Exception
            MsgBox(ex.Message)

        End Try

    End Sub

    Private Sub btnGrabar_Click(sender As System.Object, e As System.EventArgs) Handles btnGrabar.Click

        If ValidarCampos() Then
            fechaCobro.Focus()
            Exit Sub
        End If

        If codPago = 0 Then

            codPago = controller.Insert_Pagos(oiml.dbConn, fechaCobro.Value, Integer.Parse(cboCliente.SelectedValue),
                                                            txtNroRecibo.Text, txtTotalRecibo.Text, cboEstado.Text,
                                                            oiml.idUsuario)

            If codPago > 0 Then
                MessageBox.Show("Registro grabado con exito!", "Pagos", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Me.DialogResult = Windows.Forms.DialogResult.OK
                Me.Close()

            Else
                MessageBox.Show("Error: " & controller.MessageError.Message, "Pagos", MessageBoxButtons.OK, MessageBoxIcon.Error)

            End If

        Else

            If controller.Update_Pagos(oiml.dbConn, codPago, fechaCobro.Value, Integer.Parse(cboCliente.SelectedValue),
                                                            txtNroRecibo.Text, txtTotalRecibo.Text, cboEstado.Text,
                                                            oiml.idUsuario) Then

                MessageBox.Show("Registro grabado con exito!", "Pagos", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Me.DialogResult = Windows.Forms.DialogResult.OK
                Me.Close()

            Else
                MessageBox.Show("Error: " & controller.MessageError.Message, "Pagos", MessageBoxButtons.OK, MessageBoxIcon.Error)

            End If

        End If

    End Sub

    Private Sub btneliminar_Click(sender As System.Object, e As System.EventArgs) Handles btnEliminar.Click

        Try
            If codPago > 0 Then
                If MessageBox.Show("Desea eliminar el registro seleccionado?", "Pagos", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then

                    If controller.Delete_Pagos(oiml.dbConn, codPago, oiml.idUsuario) Then
                        Me.Close()

                    Else
                        MessageBox.Show("Error: " & controller.MessageError.Message, "Pagos", MessageBoxButtons.OK, MessageBoxIcon.Error)

                    End If

                End If
            End If


        Catch ex As Exception
            MsgBox(ex.Message)

        End Try

    End Sub

End Class